class Solution {
public:
    int findMin(vector<int>& nums) {

        // 因为数组是经过旋转的且是升序的，那么自然就会有两段升序的数组如下
        // [4, 5, 6, 7, 0, 1, 2]
        // 所以要找到分界点，下面可以经过一次二分查找确定出来
        int left = 0, right = nums.size() - 1;
        while(left <= right)
        {
            int mid = (left + right) / 2;
            if(nums[0] <= nums[mid])    // 注意，这里得是<=的，因为有可能出现两个数的数组，此时就是第一个数和自己比较了，因为left+right=0+1=1，再除以2就是0
                left = mid + 1;
            else
                right = mid - 1;
        }
        // 走到这，left就是第二组升序数组的起始下标

        // left如果是元素个数，也就说明数组未被旋转过，直接返回第一个元素
        // 否则，比较两段升序数组的第一个元素哪一个较小返回
        return left == nums.size() ? nums[0] : (nums[left] < nums[0] ? nums[left] : nums[0]);
    }
};